/**
 * 
 */
package com.ms.service.module.gamelog;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.ms.service.db.jedis.JedisManager;
import com.ms.service.module.gamelog.async.LogProcTaskAsync2;
import com.ms.service.telnet.STelnetCmd;
import com.xpec.c4.service.module.BasicServiceModule;
import com.xpec.c4.service.module.PropertyKey;
import com.xpec.c4.service.module.ServerProperties;
import com.xpec.c4.service.module.task.TaskTimer;

/**
 * 處理暫存 log，將 log 內容寫回 db 的 module，每個 vm 必須配置一個
 * 
 * @author TW15010
 */
public class GameLogModule extends BasicServiceModule {
	/** log4j object */
	private static final Log log = LogFactory.getLog(GameLogModule.class);
	
	/** 定時處理 log 檔的時間間隔 ms */
	public static final long LOG_PROC_INTERVAL = 250;

	/** 是否正在處理 log 檔 */
	private boolean logProcRunning = false;

	/** 用多少個執行緒來處理 log 佔存 */
	public static int LOG_ASYNC_COUNT = 1;

	/** 管理執行緒內 task 的陣列 */
	private LogProcTaskAsync2[] logAsyncList = null;

	/** 這個 module 使用的 log redis 資源號碼 */
	private int logRedisNum = 0;

	@Override
	public void init() {
		super.init();

		LOG_ASYNC_COUNT = ServerProperties.getInt(PropertyKey.gamelog_import_thread_count, 1);
		logAsyncList = new LogProcTaskAsync2[LOG_ASYNC_COUNT];
	}

	@Override
	public boolean startup() {
		// 取得自己對應的 redis 資源號碼
		String moduleId = getModuleName();
		String[] texts = moduleId.split("_");

		int moduleNum = 1;
		if (texts.length == 2) {
			moduleNum = Integer.valueOf(texts[1]);
		}

		logRedisNum = (moduleNum % JedisManager.getLogRedisCount()) + 1;

		return super.startup();
	}

	@Override
	public void onServerConnectReady() {
		LogProcTaskTimer testTask = new LogProcTaskTimer();
		testTask.setCallback(this);
		addTaskTimer(testTask, TaskTimer.LOOP, 0, LOG_PROC_INTERVAL, null);

		super.onServerConnectReady();
	}

	@Override
	public void procTelnetCommand(STelnetCmd obj) {
	}

	/**
	 * 定時觸發，處理暫存 log
	 * <p>
	 * 時間間隔：{@value #LOG_PROC_INTERVAL}
	 * 
	 */
	public void onLogProcTaskTimer() {
		// 丟入所有的執行緒中處理
		for (int i = 0; i < LOG_ASYNC_COUNT; i++) {
			if (logAsyncList[i] == null) {
				LogProcTaskAsync2 task = new LogProcTaskAsync2(i, logRedisNum, this);
				task.setQueueID(i);

				logAsyncList[i] = task;
				addAsyncCommand(task);
			}
		}
	}

	/**
	 * 當處理 log 暫存檔的異步處理 task 結束時觸發
	 */
	public void onLogProcTaskAsyncFinish(LogProcTaskAsync2 task) {
		int idx = task.getProcId();
		logAsyncList[idx] = null;
	}

	public boolean isLogProcRunning() {
		return logProcRunning;
	}

	public void setLogProcRunning(boolean logProcRunning) {
		this.logProcRunning = logProcRunning;
	}

	@Override
	public void procThrowException(Object obj) {
		return;
	}
}
